package com.mrx.commons.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.SignatureVerificationException;
import com.mrx.commons.exception.BusinessException;

import java.util.Date;

/**
 * @author : 肖康宁
 * @since : 2022-12-08 17:19
 **/
public class JWTUtil {

    public static final String SECRET = "FUCK_PASS_123456";

    private static final Algorithm algorithm = Algorithm.HMAC512(SECRET);

    private static final String issuer = "Mr.X";

    /**
     * 根据 用户名 生成 token
     *
     * @param user 用户名
     * @return 生成的 token
     */
    public static String getToken(String user) {
        // 加入时间作为随机变量
        return JWT.create().withIssuer(issuer).withClaim("createTime", new Date()).withSubject(user).sign(algorithm);
    }

    /**
     * 解析 token, 从中获取 用户名, 如果 token 校验失败, 将会抛出异常
     *
     * @param token 要解析的 token
     * @return 解析到的 用户名
     */
    public static String parseToken(String token) {
        try {
            return JWT.require(algorithm).withIssuer(issuer).build().verify(token).getSubject();
        } catch (SignatureVerificationException e) {
            throw new BusinessException("token 签名校验失败");
        }
    }

}
